#ifndef PP_UTILS_H
#define PP_UTILS_H

#include <string>
#include <vector>

#define M_ERR_COLOR_START           "\33[1;31m"
#define M_ERR_COLOR_END             "\33[0m"
#define M_INFO_COLOR_START          "\33[1;32m"
#define M_INFO_COLOR_END            "\33[0m"

/**
 * 从命令行读取命令行参数
 * @param szParam 参数变量
 * @param szFlag 参数标识
 * @param nRetCode 参数为取到的返回值
 * @param pstUsageFunc 打印提示的函数
 * @param pstData 传递给打印函数的值
 */
#define M_GET_CMD_LINE(szParam, szFlag, nRetCode, pstUsageFunc, pstData) \
    do \
    { \
        if (std::string(argv[i]) == szFlag) \
        { \
            i++; \
            if (i >= argc) \
            { \
                pstUsageFunc(pstData); \
                return nRetCode; \
            } \
            szParam = argv[i]; \
            continue; \
        } \
    } while(0)

namespace pp
{
    std::string Trim(const std::string& s);

    std::string TrimLeft(const std::string& s, const std::string& p);

    std::string TrimRight(const std::string& s, const std::string& p);

    void Split(const std::string& s, const std::string& sp, std::vector<std::string>& slist);

    std::string GetFileName(const std::string& path);

    std::string GetFileExtension(const std::string& path);

    // 去掉当前目录，当前目录以./或.\\开头
    std::string TrimPath(const std::string& path);

    // 获取两个路径的相对路径
    std::string GetRelativePath(const std::string& path, const std::string& file);

    // 创建路径
    bool CreateDirectories(const std::string& path);

    // 字段名字转驼峰命名法 (fname中出现的_或-会被去掉)
    std::string ToPascalCase(const std::string& fname);

    // 字段名字转c语言命名法 (fname中出现大写字母会转换为小写，并在前面添加_)
    std::string ToCCase(const std::string& fname);

    // 名字转换为小写
    std::string ToLower(const std::string& fname);

    // 查找替换所有
    std::string Replace(const std::string& s, const std::string& fs, const std::string& rs);

    // 第一个字母小写
    std::string ToLowerFirst(const std::string& fname);
};

#endif
